package com.iakuil.app.common.core.util;

import cn.hutool.core.util.ObjectUtil;
import lombok.experimental.UtilityClass;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;

/**
 * 对象工具类
 *
 * @author Kai
 */
@UtilityClass
public class ObjectUtils extends ObjectUtil {

    /**
     * 对象是否为空
     *
     * @param obj 对象
     * @return 是否为空对象
     */
    public static boolean isEmptyOrNull(Object obj) {
        if (obj == null) {
            return true;
        } else if (obj instanceof String) {
            return ((String) obj).isEmpty();
        } else if (obj instanceof Collection<?>) {
            return ((Collection<?>) obj).isEmpty();
        } else if (obj instanceof Iterable<?> iterable) {
            Iterator<?> iterator = iterable.iterator();
            return !iterator.hasNext();
        } else if (obj instanceof Map<?, ?>) {
            return ((Map<?, ?>) obj).isEmpty();
        } else if (obj instanceof Object[]) {
            return ((Object[]) obj).length == 0;
        } else if (obj instanceof Iterator<?>) {
            return !((Iterator<?>) obj).hasNext();
        } else if (obj instanceof Enumeration<?>) {
            return !((Enumeration<?>) obj).hasMoreElements();
        } else {
            try {
                return Array.getLength(obj) == 0;
            } catch (final IllegalArgumentException ex) {
                // Unsupported object type.
                return false;
            }
        }
    }

    /**
     * 对象是否不为空
     *
     * @param obj 对象
     * @return 对象是否不为空
     */
    public static boolean isNotEmptyOrNull(Object obj) {
        return !isEmptyOrNull(obj);
    }
}
